package top.kaoshanji.p2chapters.mapper;

import top.kaoshanji.p2chapters.model.SysRole;
import top.kaoshanji.p2chapters.model.SysUser;

import java.util.List;
import java.util.Map;

/**
 * @author kaoshanji
 * ^_^
 * create time 2025/4/12 18:10
 */
public interface UserMapper {

    /**
     * 代码清单-p2chapters-23页a：通过id查询用户
     * @param id id
     * @return SysUser
     */
    SysUser selectById(Long id);

    /**
     * 代码清单-p2chapters-26页a：查询全部用户
     * @return List
     */
    List<SysUser> selectAll();

    /**
     * 代码清单-p2chapters-31页a：根据用户id获取角色信息
     * @param userId 用户id
     * @return 角色
     */
    List<SysRole> selectRolesByUserId(Long userId);

    /**
     * 代码清单-p2chapters-33页a：根据用户id获取角色信息V1版
     * @param userId 用户id
     * @return 角色
     */
    List<SysRole> selectRolesByUserIdV1(Long userId);

    /**
     * 代码清单-p2chapters-35页a：新增用户
     * @param sysUser SysUser
     * @return 影响数据的数量
     */
    int insert(SysUser sysUser);

    /**
     * 代码清单-p2chapters-39页a：新增用户，返回自增主键
     * @param sysUser SysUser
     * @return 影响数据的数量
     */
    int insert2(SysUser sysUser);

    /**
     * 代码清单-p2chapters-43页a：根据主键更新
     * @param sysUser SysUser
     * @return 影响数据的数量
     */
    int updateById(SysUser sysUser);

    /**
     * 代码清单-p2chapters-45页a：通过主键删除
     * @param id 主键
     * @return 影响数据的数量
     */
    int deleteById(Long id);

    /**
     * 代码清单-p2chapters-45页b：通过SysUser删除
     * @param sysUser SysUser
     * @return 影响数据的数量
     */
    int deleteById(SysUser sysUser);

    /**
     * 代码清单-p2chapters-66页a：根据动态条件查询用户信息
     * @param sysUser SysUser
     * @return SysUser
     */
    List<SysUser> selectByUser(SysUser sysUser);

    /**
     * 代码清单-p2chapters-68页a：根据主键更新
     * @param sysUser SysUser
     * @return 数量
     */
    int updateByIdSelective(SysUser sysUser);

    /**
     * 代码清单-p2chapters-71页a：有id标签的插入数据
     * @param sysUser SysUser
     * @return 数量
     */
    int insert3(SysUser sysUser);

    /**
     * 代码清单-p2chapters-72页a：根据用户id或用户名查询
     * @param sysUser SysUser
     * @return SysUser
     */
    SysUser selectByIdOrUserName(SysUser sysUser);

    /**
     * 代码清单-p2chapters-75页a：根据动态条件查询用户信息（where标签版本）
     * @param sysUser SysUser
     * @return SysUser
     */
    List<SysUser> selectByUser1(SysUser sysUser);

    /**
     * 代码清单-p2chapters-76页a：根据主键更新（set标签版本）
     * @param sysUser SysUser
     * @return 数量
     */
    int updateByIdSelective1(SysUser sysUser);

    /**
     * 代码清单-p2chapters-78页a：根据用户id集合查询
     * @param idList id集合
     * @return SysUser集合
     */
    List<SysUser> selectByIdList(List<Long> idList);

    /**
     * 代码清单-p2chapters-81页a：批量插入用户信息
     * @param userList SysUser集合
     * @return 影响的数据行数
     */
    int insertList(List<SysUser> userList);

    /**
     * 代码清单-p2chapters-84页a：通过 map 更新列
     * @param map Map
     * @return 影响的数据行数
     */
    int updateByMap(Map<String, Object> map);

    /**
     * 代码清单-p2chapters-128页a：根据用户 id 获取用户信息和用户的角色信息
     * @param id 用户 id
     * @return SysUser
     */
    SysUser selectUserAndRoleById(Long id);

    /**
     * 代码清单-p2chapters-131页a：根据用户 id 获取用户信息和用户的角色信息（resultMap配置版本）
     * @param id 用户 id
     * @return SysUser
     */
    SysUser selectUserAndRoleById2(Long id);

    /**
     * 代码清单-p2chapters-133页a：根据用户 id 获取用户信息和用户的角色信息（association配置版本）
     * @param id 用户 id
     * @return SysUser
     */
    SysUser selectUserAndRoleById3(Long id);

    /**
     * 代码清单-p2chapters-135页a：根据用户 id 获取用户信息和用户的角色信息（association标签的嵌套查询）
     * @param id 用户 id
     * @return SysUser
     */
    SysUser selectUserAndRoleByIdSelect(Long id);

    /**
     * 代码清单-p2chapters-137页a：根据用户 id 获取用户信息和用户的角色信息（延迟加载）
     * @param id 用户 id
     * @return SysUser
     */
    SysUser selectUserAndRoleByIdSelect1(Long id);

    /**
     * 代码清单-p2chapters-142页a：获取所有的用户以及对应的所有角色
     * @return List
     */
    List<SysUser> selectAllUserAndRoles();

    /**
     * 代码清单-p2chapters-147页a：用户有多个角色，每个角色有多个权限
     * @return List
     */
    List<SysUser> selectAllUserAndRoles1();

    /**
     * 代码清单-p2chapters-153页a：嵌套查询指定用户的信息以及用户的角色和权限信息
     * @param id 用户id
     * @return SysUser
     */
    SysUser selectAllUserAndRolesSelect(Long id);

}
